pa_dat<-read.csv("C:/Users/rahul/OneDrive/Desktop/sustainability/starsdata/planning and administration/planning and administration.csv")
head(pa_dat)
library(ggplot2)
library(tidyr)
library(dplyr)
library(plotly)
colnames(pa_dat)[colnames(pa_dat)=="ï..Institution"] <- "Institution"
pa_dat
pa_dat_reshaped<-pa_dat%>%gather(subcategory,value_percent,Sustainability.Coordination....:Workplace.Health.and.Safety....)
pa_dat_reshaped
#Coordination and planning 
pa_dat_cp<-pa_dat%>%select(Institution,Star.category,Sustainability.Coordination....:Inclusive.and.Participatory.Governance....)
#pa_dat_cp
pa_dat_cp_reshaped<-pa_dat_cp%>%
  gather(cp_subcategory,value_percent,Sustainability.Coordination....:Inclusive.and.Participatory.Governance....)%>%
   mutate(cp_sub_cat= NA,
                    cp_sub_cat=ifelse(cp_subcategory=="Sustainability.Coordination....",
                                    "PA1",
                                   cp_sub_cat),
           cp_sub_cat=ifelse(cp_subcategory=="Sustainability.Planning....",
                                    "PA2",
                                   cp_sub_cat),
           cp_sub_cat=ifelse(cp_subcategory=="Inclusive.and.Participatory.Governance....",
                                    "PA3",
                                   cp_sub_cat)) %>%
    mutate(star_cat=ifelse(Institution=="California State University, East Bay", "CSUEB",as.character(Star.category)))
##View(pa_dat_cp_reshaped)
pa_dat_cp_reshaped$star_cat <- factor(pa_dat_cp_reshaped$star_cat,
                                               levels=c("bronze","silver","gold","CSUEB"))
ggplot(pa_dat_cp_reshaped) +
  geom_boxplot(aes(x=cp_sub_cat, y=value_percent), color="red") +
  geom_jitter(aes(x=cp_sub_cat, y=value_percent, color=star_cat, shape=star_cat, size=star_cat)) +
  scale_shape_manual(name="Star Rating",
                     values=c("bronze"=1,
                              "silver"=1,
                              "gold"=1,
                              "CSUEB"=4)) +
    scale_size_manual(name="Star Rating",
                     values=c("bronze"=3,
                              "silver"=3,
                              "gold"=3,
                              "CSUEB"=4)) +
    scale_color_manual(name="Star Rating",
                     values=c("bronze"="orange",
                              "silver"="purple",
                              "gold"="darkred",
                              "CSUEB"="#ff0000"))+
  ggtitle("Coordination and planning")+
  coord_flip()

#Diversity and Affordability 
pa_dat_da<-pa_dat%>%select(Institution,Star.category,Diversity.and.Equity.Coordination....:Affordability.and.Access....)
pa_dat_da_reshaped<-pa_dat_da%>%
  gather(da_subcategory,value_percent,Diversity.and.Equity.Coordination....:Affordability.and.Access....)%>%
    mutate(da_sub_cat= NA,
         da_sub_cat=ifelse(da_subcategory=="Diversity.and.Equity.Coordination....",
                                    "PA4",
                                   da_sub_cat),
         da_sub_cat=ifelse(da_subcategory=="Assessing.Diversity.and.Equity....",
                                    "PA5",
                                   da_sub_cat),
         da_sub_cat=ifelse(da_subcategory=="Support.for.Underrepresented.Groups....",
                                    "PA6",
                                   da_sub_cat),
                  da_sub_cat=ifelse(da_subcategory=="Affordability.and.Access....",
                                    "PA7",
                                   da_sub_cat)) %>%
    mutate(star_cat=ifelse(Institution=="California State University, East Bay", "CSUEB",as.character(Star.category)))
##View(pa_dat_da_reshaped)
pa_dat_da_reshaped$star_cat <- factor(pa_dat_da_reshaped$star_cat,
                                               levels=c("bronze","silver","gold","CSUEB"))
ggplot(pa_dat_da_reshaped) +
  geom_boxplot(aes(x=da_sub_cat, y=value_percent), color="red") +
  geom_jitter(aes(x=da_sub_cat, y=value_percent, color=star_cat, shape=star_cat, size=star_cat)) +
  scale_shape_manual(name="Star Rating",
                     values=c("bronze"=1,
                              "silver"=1,
                              "gold"=1,
                              "CSUEB"=4)) +
    scale_size_manual(name="Star Rating",
                     values=c("bronze"=3,
                              "silver"=3,
                              "gold"=3,
                              "CSUEB"=4)) +
    scale_color_manual(name="Star Rating",
                     values=c("bronze"="orange",
                              "silver"="purple",
                              "gold"="darkred",
                              "CSUEB"="#ff0000"))+
  ggtitle("Diversity and Affordability")+
  coord_flip()

#Investment and finance
pa_dat_if<-pa_dat%>%select(Institution,Star.category,Committee.on.Investor.Responsibility....:Investment.Disclosure....)
#pa_dat_if
pa_dat_if_reshaped<-pa_dat_if%>%
  gather(if_subcategory,value_percent,Committee.on.Investor.Responsibility....:Investment.Disclosure....)%>%
  mutate(if_sub_cat= NA,
                    if_sub_cat=ifelse(if_subcategory=="Committee.on.Investor.Responsibility....",
                                    "PA8",
                                   if_sub_cat),
           if_sub_cat=ifelse(if_subcategory=="Sustainable.Investment....",
                                    "PA9",
                                   if_sub_cat),
           if_sub_cat=ifelse(if_subcategory=="Investment.Disclosure....",
                                    "PA10",
                                   if_sub_cat))  %>%
    mutate(star_cat=ifelse(Institution=="California State University, East Bay", "CSUEB",as.character(Star.category)))
##View(pa_dat_if_reshaped)
pa_dat_if_reshaped$star_cat <- factor(pa_dat_if_reshaped$star_cat,
                                               levels=c("bronze","silver","gold","CSUEB"))
ggplot(pa_dat_if_reshaped) +
  geom_boxplot(aes(x=if_sub_cat, y=value_percent), color="red") +
  geom_jitter(aes(x=if_sub_cat, y=value_percent, color=star_cat, shape=star_cat, size=star_cat)) +
  scale_shape_manual(name="Star Rating",
                     values=c("bronze"=1,
                              "silver"=1,
                              "gold"=1,
                              "CSUEB"=4)) +
    scale_size_manual(name="Star Rating",
                     values=c("bronze"=3,
                              "silver"=3,
                              "gold"=3,
                              "CSUEB"=4)) +
    scale_color_manual(name="Star Rating",
                     values=c("bronze"="orange",
                              "silver"="purple",
                              "gold"="darkred",
                              "CSUEB"="#ff0000"))+
  ggtitle("Investment and Finance")+
  coord_flip()

#Wellbeing and Work
pa_dat_ww<-pa_dat%>%select(Institution,Star.category,Employee.Compensation....:Workplace.Health.and.Safety....)
#pa_dat_ww
pa_dat_ww_reshaped<-pa_dat_ww%>%
  gather(ww_subcategory,value_percent,Employee.Compensation....:Workplace.Health.and.Safety....)%>%
  mutate(ww_sub_cat= NA,
         ww_sub_cat=ifelse(ww_subcategory=="Employee.Compensation....",
                                    "PA11",
                                   ww_sub_cat),
         ww_sub_cat=ifelse(ww_subcategory=="Assessing.Employee.Satisfaction....",
                                    "PA12",
                                   ww_sub_cat),
         ww_sub_cat=ifelse(ww_subcategory=="Wellness.Program....",
                                    "PA13",
                                   ww_sub_cat),
                  ww_sub_cat=ifelse(ww_subcategory=="Workplace.Health.and.Safety....",
                                    "PA14",
                                   ww_sub_cat)) %>%
    mutate(star_cat=ifelse(Institution=="California State University, East Bay", "CSUEB",as.character(Star.category)))
##View(pa_dat_ww_reshaped)
pa_dat_ww_reshaped$star_cat <- factor(pa_dat_ww_reshaped$star_cat,
                                               levels=c("bronze","silver","gold","CSUEB"))
ggplot(pa_dat_ww_reshaped) +
  geom_boxplot(aes(x=ww_sub_cat, y=value_percent), color="red") +
  geom_jitter(aes(x=ww_sub_cat, y=value_percent, color=star_cat, shape=star_cat, size=star_cat)) +
  scale_shape_manual(name="Star Rating",
                     values=c("bronze"=1,
                              "silver"=1,
                              "gold"=1,
                              "CSUEB"=4)) +
    scale_size_manual(name="Star Rating",
                     values=c("bronze"=3,
                              "silver"=3,
                              "gold"=3,
                              "CSUEB"=4)) +
    scale_color_manual(name="Star Rating",
                     values=c("bronze"="orange",
                              "silver"="purple",
                              "gold"="darkred",
                              "CSUEB"="#ff0000"))+
  ggtitle("Wellbeing and Work")+  coord_flip()

******************CI**************

# Calculating C.I. for schools other than CSUEB and then comparing it with CSUEB
###creating a data frame 
subcategory<-NA
CI_left<-NA
CI_right<-NA
CSUEB_val<-NA
confinf_table<-data.frame(subcategory,CI_left,CI_right,CSUEB_val)
#Coordination and planning**************
cp_notCSUEB<-pa_dat_cp%>%
filter(Institution!="California State University, East Bay")#change after category
cp_CSUEB<-pa_dat_cp %>%
filter(Institution=="California State University, East Bay")#change after category
##Sustainability.Coordination....
error_sc<- qt(0.95,df=length(cp_notCSUEB$Sustainability.Coordination....)-1)*sd(cp_notCSUEB$Sustainability.Coordination....)/sqrt(length(cp_notCSUEB$Sustainability.Coordination....))#change after subcategory
left_sc <- mean(cp_notCSUEB$Sustainability.Coordination....)-error_sc ##change after subcategory
right_sc<- mean(cp_notCSUEB$Sustainability.Coordination....)+error_sc ##change after subcategory
##adding values for subcategory
confinf_table_sc<-data.frame(subcategory="Sustainability_Coordination",CI_left=left_sc,CI_right=right_sc,CSUEB_val=cp_CSUEB$Sustainability.Coordination....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_sc,confinf_table)##change after subcategory
##removing NA values 
confinf_table<-confinf_table%>%filter(!is.na(subcategory))
##Sustainability.Planning....
error_sp<- qt(0.95,df=length(cp_notCSUEB$Sustainability.Planning....)-1)*sd(cp_notCSUEB$Sustainability.Planning....)/sqrt(length(cp_notCSUEB$Sustainability.Planning....))#change after subcategory
left_sp <- mean(cp_notCSUEB$Sustainability.Planning....)-error_sp ##change after subcategory
right_sp<- mean(cp_notCSUEB$Sustainability.Planning....)+error_sp ##change after subcategory
##adding values for subcategory
confinf_table_sp<-data.frame(subcategory="Sustainability_Planning",CI_left=left_sp,CI_right=right_sp,CSUEB_val=cp_CSUEB$Sustainability.Planning....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_sp,confinf_table)##change after subcategory
##Inclusive.and.Participatory.Governance....
error_ipg<- qt(0.95,df=length(cp_notCSUEB$Inclusive.and.Participatory.Governance....)-1)*sd(cp_notCSUEB$Inclusive.and.Participatory.Governance....)/sqrt(length(cp_notCSUEB$Inclusive.and.Participatory.Governance....))#change after subcategory
left_ipg <- mean(cp_notCSUEB$Inclusive.and.Participatory.Governance....)-error_ipg ##change after subcategory
right_ipg<- mean(cp_notCSUEB$Inclusive.and.Participatory.Governance....)+error_ipg ##change after subcategory
##adding values for subcategory
confinf_table_ipg<-data.frame(subcategory="Inclusive.and.Participatory.Governance",CI_left=left_ipg,CI_right=right_ipg,CSUEB_val=cp_CSUEB$Inclusive.and.Participatory.Governance....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_ipg,confinf_table)##change after subcategory
confinf_table
#Diversity and Affordability 
da_notCSUEB<-pa_dat_da%>%
filter(Institution!="California State University, East Bay")#change after category
da_CSUEB<-pa_dat_da %>%
filter(Institution=="California State University, East Bay")#change after category
##Diversity.and.Equity.Coordination....
error_dec<- qt(0.95,df=length(da_notCSUEB$Diversity.and.Equity.Coordination....)-1)*sd(da_notCSUEB$Diversity.and.Equity.Coordination....)/sqrt(length(da_notCSUEB$Diversity.and.Equity.Coordination....))#change after subcategory
left_dec <- mean(da_notCSUEB$Diversity.and.Equity.Coordination....)-error_dec ##change after subcategory
right_dec<- mean(da_notCSUEB$Diversity.and.Equity.Coordination....)+error_dec ##change after subcategory
##adding values for subcategory
confinf_table_dec<-data.frame(subcategory="Diversity.and.Equity.Coordination",CI_left=left_dec,CI_right=right_dec,CSUEB_val=da_CSUEB$Diversity.and.Equity.Coordination....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_dec,confinf_table)##change after subcategory
##Assessing.Diversity.and.Equity....
error_ade<- qt(0.95,df=length(da_notCSUEB$Assessing.Diversity.and.Equity....)-1)*sd(da_notCSUEB$Assessing.Diversity.and.Equity....)/sqrt(length(da_notCSUEB$Assessing.Diversity.and.Equity....))#change after subcategory
left_ade <- mean(da_notCSUEB$Assessing.Diversity.and.Equity....)-error_ade ##change after subcategory
right_ade<- mean(da_notCSUEB$Assessing.Diversity.and.Equity....)+error_ade ##change after subcategory
##adding values for subcategory
confinf_table_ade<-data.frame(subcategory="Assessing.Diversity.and.Equity",CI_left=left_ade,CI_right=right_ade,CSUEB_val=da_CSUEB$Assessing.Diversity.and.Equity....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_ade,confinf_table)##change after subcategory
##Support.for.Underrepresented.Groups....
error_sug<- qt(0.95,df=length(da_notCSUEB$Support.for.Underrepresented.Groups....)-1)*sd(da_notCSUEB$Support.for.Underrepresented.Groups....)/sqrt(length(da_notCSUEB$Support.for.Underrepresented.Groups....))#change after subcategory
left_sug <- mean(da_notCSUEB$Support.for.Underrepresented.Groups....)-error_sug ##change after subcategory
right_sug<- mean(da_notCSUEB$Support.for.Underrepresented.Groups....)+error_sug ##change after subcategory
##adding values for subcategory
confinf_table_sug<-data.frame(subcategory="Support.for.Underrepresented.Groups",CI_left=left_sug,CI_right=right_sug,CSUEB_val=da_CSUEB$Support.for.Underrepresented.Groups....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_sug,confinf_table)##change after subcategory
##Affordability.and.Access....
error_aa<- qt(0.95,df=length(da_notCSUEB$Affordability.and.Access....)-1)*sd(da_notCSUEB$Affordability.and.Access....)/sqrt(length(da_notCSUEB$Affordability.and.Access....))#change after subcategory
left_aa <- mean(da_notCSUEB$Affordability.and.Access....)-error_aa ##change after subcategory
right_aa<- mean(da_notCSUEB$Affordability.and.Access....)+error_aa ##change after subcategory
##adding values for subcategory
confinf_table_aa<-data.frame(subcategory="Affordability.and.Access",CI_left=left_aa,CI_right=right_aa,CSUEB_val=da_CSUEB$Affordability.and.Access....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_aa,confinf_table)##change after subcategory
confinf_table
# Investment and finance
if_notCSUEB<-pa_dat_if%>%
filter(Institution!="California State University, East Bay")#change after category
if_CSUEB<-pa_dat_if %>%
filter(Institution=="California State University, East Bay")#change after category
##Committee.on.Investor.Responsibility....
error_cir<- qt(0.95,df=length(if_notCSUEB$Committee.on.Investor.Responsibility....)-1)*sd(if_notCSUEB$Committee.on.Investor.Responsibility....)/sqrt(length(if_notCSUEB$Committee.on.Investor.Responsibility....))#change after subcategory
left_cir <- mean(if_notCSUEB$Committee.on.Investor.Responsibility....)-error_cir ##change after subcategory
right_cir<- mean(if_notCSUEB$Committee.on.Investor.Responsibility....)+error_cir ##change after subcategory
##adding values for subcategory
confinf_table_cir<-data.frame(subcategory="Committee.on.Investor.Responsibility",CI_left=0,CI_right=right_cir,CSUEB_val=if_CSUEB$Committee.on.Investor.Responsibility....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_cir,confinf_table)##change after subcategory
##Sustainable.Investment....
error_si<- qt(0.95,df=length(if_notCSUEB$Sustainable.Investment....)-1)*sd(if_notCSUEB$Sustainable.Investment....)/sqrt(length(if_notCSUEB$Sustainable.Investment....))#change after subcategory
left_si <- mean(if_notCSUEB$Sustainable.Investment....)-error_si ##change after subcategory
right_si<- mean(if_notCSUEB$Sustainable.Investment....)+error_si ##change after subcategory
##adding values for subcategory
confinf_table_si<-data.frame(subcategory="Sustainable.Investment",CI_left=left_si,CI_right=right_si,CSUEB_val=if_CSUEB$Sustainable.Investment....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_si,confinf_table)##change after subcategory
##Investment.Disclosure....
error_id<- qt(0.95,df=length(if_notCSUEB$Investment.Disclosure....)-1)*sd(if_notCSUEB$Investment.Disclosure....)/sqrt(length(if_notCSUEB$Investment.Disclosure....))#change after subcategory
left_id <- mean(if_notCSUEB$Investment.Disclosure....)-error_id ##change after subcategory
right_id<- mean(if_notCSUEB$Investment.Disclosure....)+error_id ##change after subcategory
##adding values for subcategory
confinf_table_id<-data.frame(subcategory="Investment.Disclosure",CI_left=left_id,CI_right=right_id,CSUEB_val=if_CSUEB$Investment.Disclosure....)##change after subcategory
##binding row in the data frame
confinf_table<-rbind(confinf_table_id,confinf_table)##change after subcategory
confinf_table
#colnames(pa_dat)
ggplot(confinf_table)+
  geom_crossbar(aes(x=subcategory,y=(CI_left+CI_right)/2,ymin=CI_left,ymax=CI_right),xlab="",ylab="mean")+
  geom_point(aes(x=subcategory,y=CSUEB_val),col="red") + 
  coord_flip()+
  ggtitle("Planning and Administration")+ylab("mean")
Ignoring unknown parameters: xlab, ylab

Climate Action Plan

PA 2,3,4

pa_dat_cp<-pa_dat%>%select(Institution,Star.category,Sustainability.Planning....,Inclusive.and.Participatory.Governance....,Reporting.Assurance....)
#pa_dat_cp
pa_dat_cp_reshaped<-pa_dat_cp%>%
  gather(cp_subcategory,score,Sustainability.Planning....,Inclusive.and.Participatory.Governance....,Reporting.Assurance....)%>%
   mutate(PA_credits= NA,
                    PA_credits=ifelse(cp_subcategory=="Sustainability.Planning....",
                                    "PA-2: Sustainability Planning",
                                   PA_credits),
           PA_credits=ifelse(cp_subcategory=="Inclusive.and.Participatory.Governance....",
                                    "PA-3: Participatory Governance",
                                   PA_credits),
           PA_credits=ifelse(cp_subcategory=="Reporting.Assurance....",
                                    "PA-4: Diversity and Equity Coordination",
                                   PA_credits)) %>%
    mutate(star_cat=ifelse(Institution=="California State University, East Bay", "CSUEB",as.character(Star.category)))
##View(pa_dat_cp_reshaped)
pa_dat_cp_reshaped$star_cat <- factor(pa_dat_cp_reshaped$star_cat,
                                               levels=c("bronze","silver","gold","CSUEB"))
ggplot(pa_dat_cp_reshaped) +
  geom_boxplot(aes(x=PA_credits, y=score), color="red") +
  geom_jitter(aes(x=PA_credits, y=score, color=star_cat, shape=star_cat, size=star_cat)) +
  scale_shape_manual(name="Star Rating",
                     values=c("bronze"=1,
                              "silver"=1,
                              "gold"=1,
                              "CSUEB"=4)) +
    scale_size_manual(name="Star Rating",
                     values=c("bronze"=3,
                              "silver"=3,
                              "gold"=3,
                              "CSUEB"=4)) +
    scale_color_manual(name="Star Rating",
                     values=c("bronze"="darkred",
                              "silver"="gray47",
                              "gold"="orange",
                              "CSUEB"="#ff0000"))+
  ggtitle("Planning and Administration")+
  coord_flip()+ylab("Percentage of total score")

head(pa_dat)

PA 9,10,11

pa_dat_cp<-pa_dat%>%select(Institution,Star.category,Sustainable.Investment....,Investment.Disclosure....,Employee.Compensation....)
#pa_dat_cp
pa_dat_cp_reshaped<-pa_dat_cp%>%
  gather(cp_subcategory,score,Sustainable.Investment....,Investment.Disclosure....,Employee.Compensation....)%>%
   mutate(PA_credits= NA,
                    PA_credits=ifelse(cp_subcategory=="Sustainable.Investment....",
                                    "PA-9: Sustainable Investment",
                                   PA_credits),
           PA_credits=ifelse(cp_subcategory=="Investment.Disclosure....",
                                    "PA-10: Investment Disclosure",
                                   PA_credits),
           PA_credits=ifelse(cp_subcategory=="Employee.Compensation....",
                                    "PA-11: Employee Compensation",
                                   PA_credits)) %>%
    mutate(star_cat=ifelse(Institution=="California State University, East Bay", "CSUEB",as.character(Star.category)))
##View(pa_dat_cp_reshaped)
pa_dat_cp_reshaped$star_cat <- factor(pa_dat_cp_reshaped$star_cat,
                                               levels=c("bronze","silver","gold","CSUEB"))
ggplot(pa_dat_cp_reshaped) +
  geom_boxplot(aes(x=PA_credits, y=score), color="red") +
  geom_jitter(aes(x=PA_credits, y=score, color=star_cat, shape=star_cat, size=star_cat)) +
  scale_shape_manual(name="Star Rating",
                     values=c("bronze"=1,
                              "silver"=1,
                              "gold"=1,
                              "CSUEB"=4)) +
    scale_size_manual(name="Star Rating",
                     values=c("bronze"=3,
                              "silver"=3,
                              "gold"=3,
                              "CSUEB"=4)) +
    scale_color_manual(name="Star Rating",
                     values=c("bronze"="darkred",
                              "silver"="gray47",
                              "gold"="orange",
                              "CSUEB"="#ff0000"))+
  ggtitle("Planning and Administration")+
  coord_flip()

PLOTLY Graph

library(plotly)
pa_ly<-ggplot(pa_dat_cp_reshaped) +
  geom_boxplot(aes(x=PA_credits, y=score), color="red") +
  geom_jitter(aes(x=PA_credits, y=score, color=star_cat, shape=star_cat, size=star_cat,label=Institution)) +
  scale_shape_manual(name="Star Rating",
                     values=c("bronze"=1,
                              "silver"=1,
                              "gold"=1,
                              "CSUEB"=4)) +
    scale_size_manual(name="Star Rating",
                     values=c("bronze"=3,
                              "silver"=3,
                              "gold"=3,
                              "CSUEB"=4)) +
    scale_color_manual(name="Star Rating",
                     values=c("bronze"="darkred",
                              "silver"="gray47",
                              "gold"="orange",
                              "CSUEB"="#ff0000"))+
  ggtitle("Planning and Administration")+
  coord_flip()
Ignoring unknown aesthetics: label
ggplotly(pa_ly)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCg0KYGBge3J9DQpwYV9kYXQ8LXJlYWQuY3N2KCJDOi9Vc2Vycy9yYWh1bC9PbmVEcml2ZS9EZXNrdG9wL3N1c3RhaW5hYmlsaXR5L3N0YXJzZGF0YS9wbGFubmluZyBhbmQgYWRtaW5pc3RyYXRpb24vcGxhbm5pbmcgYW5kIGFkbWluaXN0cmF0aW9uLmNzdiIpDQoNCmhlYWQocGFfZGF0KQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShkcGx5cikNCmNvbG5hbWVzKHBhX2RhdClbY29sbmFtZXMocGFfZGF0KT09Iu8uLkluc3RpdHV0aW9uIl0gPC0gIkluc3RpdHV0aW9uIg0KcGFfZGF0DQoNCnBhX2RhdF9yZXNoYXBlZDwtcGFfZGF0JT4lZ2F0aGVyKHN1YmNhdGVnb3J5LHZhbHVlX3BlcmNlbnQsU3VzdGFpbmFiaWxpdHkuQ29vcmRpbmF0aW9uLi4uLjpXb3JrcGxhY2UuSGVhbHRoLmFuZC5TYWZldHkuLi4uKQ0KcGFfZGF0X3Jlc2hhcGVkDQoNCg0KYGBgDQoNCmBgYHtyfQ0KI0Nvb3JkaW5hdGlvbiBhbmQgcGxhbm5pbmcgDQpwYV9kYXRfY3A8LXBhX2RhdCU+JXNlbGVjdChJbnN0aXR1dGlvbixTdGFyLmNhdGVnb3J5LFN1c3RhaW5hYmlsaXR5LkNvb3JkaW5hdGlvbi4uLi46SW5jbHVzaXZlLmFuZC5QYXJ0aWNpcGF0b3J5LkdvdmVybmFuY2UuLi4uKQ0KI3BhX2RhdF9jcA0KDQpwYV9kYXRfY3BfcmVzaGFwZWQ8LXBhX2RhdF9jcCU+JQ0KICBnYXRoZXIoY3Bfc3ViY2F0ZWdvcnksdmFsdWVfcGVyY2VudCxTdXN0YWluYWJpbGl0eS5Db29yZGluYXRpb24uLi4uOkluY2x1c2l2ZS5hbmQuUGFydGljaXBhdG9yeS5Hb3Zlcm5hbmNlLi4uLiklPiUNCiAgIG11dGF0ZShjcF9zdWJfY2F0PSBOQSwNCiAgICAgICAgICAgICAgICAgICAgY3Bfc3ViX2NhdD1pZmVsc2UoY3Bfc3ViY2F0ZWdvcnk9PSJTdXN0YWluYWJpbGl0eS5Db29yZGluYXRpb24uLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQTEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcF9zdWJfY2F0KSwNCiAgICAgICAgICAgY3Bfc3ViX2NhdD1pZmVsc2UoY3Bfc3ViY2F0ZWdvcnk9PSJTdXN0YWluYWJpbGl0eS5QbGFubmluZy4uLi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwX3N1Yl9jYXQpLA0KICAgICAgICAgICBjcF9zdWJfY2F0PWlmZWxzZShjcF9zdWJjYXRlZ29yeT09IkluY2x1c2l2ZS5hbmQuUGFydGljaXBhdG9yeS5Hb3Zlcm5hbmNlLi4uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEEzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Bfc3ViX2NhdCkpICU+JQ0KICAgIG11dGF0ZShzdGFyX2NhdD1pZmVsc2UoSW5zdGl0dXRpb249PSJDYWxpZm9ybmlhIFN0YXRlIFVuaXZlcnNpdHksIEVhc3QgQmF5IiwgIkNTVUVCIixhcy5jaGFyYWN0ZXIoU3Rhci5jYXRlZ29yeSkpKQ0KDQojI1ZpZXcocGFfZGF0X2NwX3Jlc2hhcGVkKQ0KcGFfZGF0X2NwX3Jlc2hhcGVkJHN0YXJfY2F0IDwtIGZhY3RvcihwYV9kYXRfY3BfcmVzaGFwZWQkc3Rhcl9jYXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJicm9uemUiLCJzaWx2ZXIiLCJnb2xkIiwiQ1NVRUIiKSkNCmdncGxvdChwYV9kYXRfY3BfcmVzaGFwZWQpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyh4PWNwX3N1Yl9jYXQsIHk9dmFsdWVfcGVyY2VudCksIGNvbG9yPSJyZWQiKSArDQogIGdlb21faml0dGVyKGFlcyh4PWNwX3N1Yl9jYXQsIHk9dmFsdWVfcGVyY2VudCwgY29sb3I9c3Rhcl9jYXQsIHNoYXBlPXN0YXJfY2F0LCBzaXplPXN0YXJfY2F0KSkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZT0iU3RhciBSYXRpbmciLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoImJyb256ZSI9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWx2ZXIiPTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZCI9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU1VFQiI9NCkpICsNCiAgICBzY2FsZV9zaXplX21hbnVhbChuYW1lPSJTdGFyIFJhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiYnJvbnplIj0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkIj0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj00KSkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPSJTdGFyIFJhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiYnJvbnplIj0ib3JhbmdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWx2ZXIiPSJwdXJwbGUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvbGQiPSJkYXJrcmVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU1VFQiI9IiNmZjAwMDAiKSkrDQogIGdndGl0bGUoIkNvb3JkaW5hdGlvbiBhbmQgcGxhbm5pbmciKSsNCiAgY29vcmRfZmxpcCgpDQoNCmBgYA0KDQpgYGB7cn0NCiNEaXZlcnNpdHkgYW5kIEFmZm9yZGFiaWxpdHkgDQpwYV9kYXRfZGE8LXBhX2RhdCU+JXNlbGVjdChJbnN0aXR1dGlvbixTdGFyLmNhdGVnb3J5LERpdmVyc2l0eS5hbmQuRXF1aXR5LkNvb3JkaW5hdGlvbi4uLi46QWZmb3JkYWJpbGl0eS5hbmQuQWNjZXNzLi4uLikNCg0KDQpwYV9kYXRfZGFfcmVzaGFwZWQ8LXBhX2RhdF9kYSU+JQ0KICBnYXRoZXIoZGFfc3ViY2F0ZWdvcnksdmFsdWVfcGVyY2VudCxEaXZlcnNpdHkuYW5kLkVxdWl0eS5Db29yZGluYXRpb24uLi4uOkFmZm9yZGFiaWxpdHkuYW5kLkFjY2Vzcy4uLi4pJT4lDQogICAgbXV0YXRlKGRhX3N1Yl9jYXQ9IE5BLA0KICAgICAgICAgZGFfc3ViX2NhdD1pZmVsc2UoZGFfc3ViY2F0ZWdvcnk9PSJEaXZlcnNpdHkuYW5kLkVxdWl0eS5Db29yZGluYXRpb24uLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQTQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYV9zdWJfY2F0KSwNCiAgICAgICAgIGRhX3N1Yl9jYXQ9aWZlbHNlKGRhX3N1YmNhdGVnb3J5PT0iQXNzZXNzaW5nLkRpdmVyc2l0eS5hbmQuRXF1aXR5Li4uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEE1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFfc3ViX2NhdCksDQogICAgICAgICBkYV9zdWJfY2F0PWlmZWxzZShkYV9zdWJjYXRlZ29yeT09IlN1cHBvcnQuZm9yLlVuZGVycmVwcmVzZW50ZWQuR3JvdXBzLi4uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEE2IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFfc3ViX2NhdCksDQogICAgICAgICAgICAgICAgICBkYV9zdWJfY2F0PWlmZWxzZShkYV9zdWJjYXRlZ29yeT09IkFmZm9yZGFiaWxpdHkuYW5kLkFjY2Vzcy4uLi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBNyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhX3N1Yl9jYXQpKSAlPiUNCiAgICBtdXRhdGUoc3Rhcl9jYXQ9aWZlbHNlKEluc3RpdHV0aW9uPT0iQ2FsaWZvcm5pYSBTdGF0ZSBVbml2ZXJzaXR5LCBFYXN0IEJheSIsICJDU1VFQiIsYXMuY2hhcmFjdGVyKFN0YXIuY2F0ZWdvcnkpKSkNCg0KIyNWaWV3KHBhX2RhdF9kYV9yZXNoYXBlZCkNCnBhX2RhdF9kYV9yZXNoYXBlZCRzdGFyX2NhdCA8LSBmYWN0b3IocGFfZGF0X2RhX3Jlc2hhcGVkJHN0YXJfY2F0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiYnJvbnplIiwic2lsdmVyIiwiZ29sZCIsIkNTVUVCIikpDQpnZ3Bsb3QocGFfZGF0X2RhX3Jlc2hhcGVkKSArDQogIGdlb21fYm94cGxvdChhZXMoeD1kYV9zdWJfY2F0LCB5PXZhbHVlX3BlcmNlbnQpLCBjb2xvcj0icmVkIikgKw0KICBnZW9tX2ppdHRlcihhZXMoeD1kYV9zdWJfY2F0LCB5PXZhbHVlX3BlcmNlbnQsIGNvbG9yPXN0YXJfY2F0LCBzaGFwZT1zdGFyX2NhdCwgc2l6ZT1zdGFyX2NhdCkpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsdmVyIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvbGQiPTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NVRUIiPTQpKSArDQogICAgc2NhbGVfc2l6ZV9tYW51YWwobmFtZT0iU3RhciBSYXRpbmciLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoImJyb256ZSI9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWx2ZXIiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZCI9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU1VFQiI9NCkpICsNCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZT0iU3RhciBSYXRpbmciLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoImJyb256ZSI9Im9yYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsdmVyIj0icHVycGxlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkIj0iZGFya3JlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NVRUIiPSIjZmYwMDAwIikpKw0KICBnZ3RpdGxlKCJEaXZlcnNpdHkgYW5kIEFmZm9yZGFiaWxpdHkiKSsNCiAgY29vcmRfZmxpcCgpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KI0ludmVzdG1lbnQgYW5kIGZpbmFuY2UNCnBhX2RhdF9pZjwtcGFfZGF0JT4lc2VsZWN0KEluc3RpdHV0aW9uLFN0YXIuY2F0ZWdvcnksQ29tbWl0dGVlLm9uLkludmVzdG9yLlJlc3BvbnNpYmlsaXR5Li4uLjpJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uKQ0KI3BhX2RhdF9pZg0KDQpwYV9kYXRfaWZfcmVzaGFwZWQ8LXBhX2RhdF9pZiU+JQ0KICBnYXRoZXIoaWZfc3ViY2F0ZWdvcnksdmFsdWVfcGVyY2VudCxDb21taXR0ZWUub24uSW52ZXN0b3IuUmVzcG9uc2liaWxpdHkuLi4uOkludmVzdG1lbnQuRGlzY2xvc3VyZS4uLi4pJT4lDQogIG11dGF0ZShpZl9zdWJfY2F0PSBOQSwNCiAgICAgICAgICAgICAgICAgICAgaWZfc3ViX2NhdD1pZmVsc2UoaWZfc3ViY2F0ZWdvcnk9PSJDb21taXR0ZWUub24uSW52ZXN0b3IuUmVzcG9uc2liaWxpdHkuLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQTgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZl9zdWJfY2F0KSwNCiAgICAgICAgICAgaWZfc3ViX2NhdD1pZmVsc2UoaWZfc3ViY2F0ZWdvcnk9PSJTdXN0YWluYWJsZS5JbnZlc3RtZW50Li4uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEE5IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZfc3ViX2NhdCksDQogICAgICAgICAgIGlmX3N1Yl9jYXQ9aWZlbHNlKGlmX3N1YmNhdGVnb3J5PT0iSW52ZXN0bWVudC5EaXNjbG9zdXJlLi4uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEExMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmX3N1Yl9jYXQpKSAgJT4lDQogICAgbXV0YXRlKHN0YXJfY2F0PWlmZWxzZShJbnN0aXR1dGlvbj09IkNhbGlmb3JuaWEgU3RhdGUgVW5pdmVyc2l0eSwgRWFzdCBCYXkiLCAiQ1NVRUIiLGFzLmNoYXJhY3RlcihTdGFyLmNhdGVnb3J5KSkpDQoNCiMjVmlldyhwYV9kYXRfaWZfcmVzaGFwZWQpDQpwYV9kYXRfaWZfcmVzaGFwZWQkc3Rhcl9jYXQgPC0gZmFjdG9yKHBhX2RhdF9pZl9yZXNoYXBlZCRzdGFyX2NhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoImJyb256ZSIsInNpbHZlciIsImdvbGQiLCJDU1VFQiIpKQ0KZ2dwbG90KHBhX2RhdF9pZl9yZXNoYXBlZCkgKw0KICBnZW9tX2JveHBsb3QoYWVzKHg9aWZfc3ViX2NhdCwgeT12YWx1ZV9wZXJjZW50KSwgY29sb3I9InJlZCIpICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKHg9aWZfc3ViX2NhdCwgeT12YWx1ZV9wZXJjZW50LCBjb2xvcj1zdGFyX2NhdCwgc2hhcGU9c3Rhcl9jYXQsIHNpemU9c3Rhcl9jYXQpKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lPSJTdGFyIFJhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiYnJvbnplIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj00KSkgKw0KICAgIHNjYWxlX3NpemVfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsdmVyIj0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvbGQiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NVRUIiPTQpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPSJvcmFuZ2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9InB1cnBsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZCI9ImRhcmtyZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj0iI2ZmMDAwMCIpKSsNCiAgZ2d0aXRsZSgiSW52ZXN0bWVudCBhbmQgRmluYW5jZSIpKw0KICBjb29yZF9mbGlwKCkNCg0KYGBgDQoNCmBgYHtyfQ0KI1dlbGxiZWluZyBhbmQgV29yaw0KcGFfZGF0X3d3PC1wYV9kYXQlPiVzZWxlY3QoSW5zdGl0dXRpb24sU3Rhci5jYXRlZ29yeSxFbXBsb3llZS5Db21wZW5zYXRpb24uLi4uOldvcmtwbGFjZS5IZWFsdGguYW5kLlNhZmV0eS4uLi4pDQojcGFfZGF0X3d3DQoNCnBhX2RhdF93d19yZXNoYXBlZDwtcGFfZGF0X3d3JT4lDQogIGdhdGhlcih3d19zdWJjYXRlZ29yeSx2YWx1ZV9wZXJjZW50LEVtcGxveWVlLkNvbXBlbnNhdGlvbi4uLi46V29ya3BsYWNlLkhlYWx0aC5hbmQuU2FmZXR5Li4uLiklPiUNCiAgbXV0YXRlKHd3X3N1Yl9jYXQ9IE5BLA0KICAgICAgICAgd3dfc3ViX2NhdD1pZmVsc2Uod3dfc3ViY2F0ZWdvcnk9PSJFbXBsb3llZS5Db21wZW5zYXRpb24uLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQTExIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3dfc3ViX2NhdCksDQogICAgICAgICB3d19zdWJfY2F0PWlmZWxzZSh3d19zdWJjYXRlZ29yeT09IkFzc2Vzc2luZy5FbXBsb3llZS5TYXRpc2ZhY3Rpb24uLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQTEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3dfc3ViX2NhdCksDQogICAgICAgICB3d19zdWJfY2F0PWlmZWxzZSh3d19zdWJjYXRlZ29yeT09IldlbGxuZXNzLlByb2dyYW0uLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQTEzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3dfc3ViX2NhdCksDQogICAgICAgICAgICAgICAgICB3d19zdWJfY2F0PWlmZWxzZSh3d19zdWJjYXRlZ29yeT09IldvcmtwbGFjZS5IZWFsdGguYW5kLlNhZmV0eS4uLi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBMTQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3d19zdWJfY2F0KSkgJT4lDQogICAgbXV0YXRlKHN0YXJfY2F0PWlmZWxzZShJbnN0aXR1dGlvbj09IkNhbGlmb3JuaWEgU3RhdGUgVW5pdmVyc2l0eSwgRWFzdCBCYXkiLCAiQ1NVRUIiLGFzLmNoYXJhY3RlcihTdGFyLmNhdGVnb3J5KSkpDQoNCiMjVmlldyhwYV9kYXRfd3dfcmVzaGFwZWQpDQpwYV9kYXRfd3dfcmVzaGFwZWQkc3Rhcl9jYXQgPC0gZmFjdG9yKHBhX2RhdF93d19yZXNoYXBlZCRzdGFyX2NhdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzPWMoImJyb256ZSIsInNpbHZlciIsImdvbGQiLCJDU1VFQiIpKQ0KZ2dwbG90KHBhX2RhdF93d19yZXNoYXBlZCkgKw0KICBnZW9tX2JveHBsb3QoYWVzKHg9d3dfc3ViX2NhdCwgeT12YWx1ZV9wZXJjZW50KSwgY29sb3I9InJlZCIpICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKHg9d3dfc3ViX2NhdCwgeT12YWx1ZV9wZXJjZW50LCBjb2xvcj1zdGFyX2NhdCwgc2hhcGU9c3Rhcl9jYXQsIHNpemU9c3Rhcl9jYXQpKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lPSJTdGFyIFJhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiYnJvbnplIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj00KSkgKw0KICAgIHNjYWxlX3NpemVfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsdmVyIj0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvbGQiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NVRUIiPTQpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPSJvcmFuZ2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9InB1cnBsZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZCI9ImRhcmtyZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj0iI2ZmMDAwMCIpKSsNCiAgZ2d0aXRsZSgiV2VsbGJlaW5nIGFuZCBXb3JrIikrICBjb29yZF9mbGlwKCkNCg0KDQpgYGANCiMqKioqKioqKioqKioqKioqKipDSSoqKioqKioqKioqKioqDQoNCmBgYHtyfQ0KIyBDYWxjdWxhdGluZyBDLkkuIGZvciBzY2hvb2xzIG90aGVyIHRoYW4gQ1NVRUIgYW5kIHRoZW4gY29tcGFyaW5nIGl0IHdpdGggQ1NVRUINCg0KIyMjY3JlYXRpbmcgYSBkYXRhIGZyYW1lIA0Kc3ViY2F0ZWdvcnk8LU5BDQpDSV9sZWZ0PC1OQQ0KQ0lfcmlnaHQ8LU5BDQpDU1VFQl92YWw8LU5BDQpjb25maW5mX3RhYmxlPC1kYXRhLmZyYW1lKHN1YmNhdGVnb3J5LENJX2xlZnQsQ0lfcmlnaHQsQ1NVRUJfdmFsKQ0KDQoNCiNDb29yZGluYXRpb24gYW5kIHBsYW5uaW5nKioqKioqKioqKioqKioNCg0KY3Bfbm90Q1NVRUI8LXBhX2RhdF9jcCU+JQ0KZmlsdGVyKEluc3RpdHV0aW9uIT0iQ2FsaWZvcm5pYSBTdGF0ZSBVbml2ZXJzaXR5LCBFYXN0IEJheSIpI2NoYW5nZSBhZnRlciBjYXRlZ29yeQ0KDQpjcF9DU1VFQjwtcGFfZGF0X2NwICU+JQ0KZmlsdGVyKEluc3RpdHV0aW9uPT0iQ2FsaWZvcm5pYSBTdGF0ZSBVbml2ZXJzaXR5LCBFYXN0IEJheSIpI2NoYW5nZSBhZnRlciBjYXRlZ29yeQ0KDQojI1N1c3RhaW5hYmlsaXR5LkNvb3JkaW5hdGlvbi4uLi4NCmVycm9yX3NjPC0gcXQoMC45NSxkZj1sZW5ndGgoY3Bfbm90Q1NVRUIkU3VzdGFpbmFiaWxpdHkuQ29vcmRpbmF0aW9uLi4uLiktMSkqc2QoY3Bfbm90Q1NVRUIkU3VzdGFpbmFiaWxpdHkuQ29vcmRpbmF0aW9uLi4uLikvc3FydChsZW5ndGgoY3Bfbm90Q1NVRUIkU3VzdGFpbmFiaWxpdHkuQ29vcmRpbmF0aW9uLi4uLikpI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpsZWZ0X3NjIDwtIG1lYW4oY3Bfbm90Q1NVRUIkU3VzdGFpbmFiaWxpdHkuQ29vcmRpbmF0aW9uLi4uLiktZXJyb3Jfc2MgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KcmlnaHRfc2M8LSBtZWFuKGNwX25vdENTVUVCJFN1c3RhaW5hYmlsaXR5LkNvb3JkaW5hdGlvbi4uLi4pK2Vycm9yX3NjICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCg0KDQojI2FkZGluZyB2YWx1ZXMgZm9yIHN1YmNhdGVnb3J5DQpjb25maW5mX3RhYmxlX3NjPC1kYXRhLmZyYW1lKHN1YmNhdGVnb3J5PSJTdXN0YWluYWJpbGl0eV9Db29yZGluYXRpb24iLENJX2xlZnQ9bGVmdF9zYyxDSV9yaWdodD1yaWdodF9zYyxDU1VFQl92YWw9Y3BfQ1NVRUIkU3VzdGFpbmFiaWxpdHkuQ29vcmRpbmF0aW9uLi4uLikjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI2JpbmRpbmcgcm93IGluIHRoZSBkYXRhIGZyYW1lDQpjb25maW5mX3RhYmxlPC1yYmluZChjb25maW5mX3RhYmxlX3NjLGNvbmZpbmZfdGFibGUpIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KIyNyZW1vdmluZyBOQSB2YWx1ZXMgDQpjb25maW5mX3RhYmxlPC1jb25maW5mX3RhYmxlJT4lZmlsdGVyKCFpcy5uYShzdWJjYXRlZ29yeSkpDQoNCg0KIyNTdXN0YWluYWJpbGl0eS5QbGFubmluZy4uLi4NCmVycm9yX3NwPC0gcXQoMC45NSxkZj1sZW5ndGgoY3Bfbm90Q1NVRUIkU3VzdGFpbmFiaWxpdHkuUGxhbm5pbmcuLi4uKS0xKSpzZChjcF9ub3RDU1VFQiRTdXN0YWluYWJpbGl0eS5QbGFubmluZy4uLi4pL3NxcnQobGVuZ3RoKGNwX25vdENTVUVCJFN1c3RhaW5hYmlsaXR5LlBsYW5uaW5nLi4uLikpI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpsZWZ0X3NwIDwtIG1lYW4oY3Bfbm90Q1NVRUIkU3VzdGFpbmFiaWxpdHkuUGxhbm5pbmcuLi4uKS1lcnJvcl9zcCAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpyaWdodF9zcDwtIG1lYW4oY3Bfbm90Q1NVRUIkU3VzdGFpbmFiaWxpdHkuUGxhbm5pbmcuLi4uKStlcnJvcl9zcCAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQoNCg0KIyNhZGRpbmcgdmFsdWVzIGZvciBzdWJjYXRlZ29yeQ0KY29uZmluZl90YWJsZV9zcDwtZGF0YS5mcmFtZShzdWJjYXRlZ29yeT0iU3VzdGFpbmFiaWxpdHlfUGxhbm5pbmciLENJX2xlZnQ9bGVmdF9zcCxDSV9yaWdodD1yaWdodF9zcCxDU1VFQl92YWw9Y3BfQ1NVRUIkU3VzdGFpbmFiaWxpdHkuUGxhbm5pbmcuLi4uKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCiMjYmluZGluZyByb3cgaW4gdGhlIGRhdGEgZnJhbWUNCmNvbmZpbmZfdGFibGU8LXJiaW5kKGNvbmZpbmZfdGFibGVfc3AsY29uZmluZl90YWJsZSkjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI0luY2x1c2l2ZS5hbmQuUGFydGljaXBhdG9yeS5Hb3Zlcm5hbmNlLi4uLg0KZXJyb3JfaXBnPC0gcXQoMC45NSxkZj1sZW5ndGgoY3Bfbm90Q1NVRUIkSW5jbHVzaXZlLmFuZC5QYXJ0aWNpcGF0b3J5LkdvdmVybmFuY2UuLi4uKS0xKSpzZChjcF9ub3RDU1VFQiRJbmNsdXNpdmUuYW5kLlBhcnRpY2lwYXRvcnkuR292ZXJuYW5jZS4uLi4pL3NxcnQobGVuZ3RoKGNwX25vdENTVUVCJEluY2x1c2l2ZS5hbmQuUGFydGljaXBhdG9yeS5Hb3Zlcm5hbmNlLi4uLikpI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpsZWZ0X2lwZyA8LSBtZWFuKGNwX25vdENTVUVCJEluY2x1c2l2ZS5hbmQuUGFydGljaXBhdG9yeS5Hb3Zlcm5hbmNlLi4uLiktZXJyb3JfaXBnICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCnJpZ2h0X2lwZzwtIG1lYW4oY3Bfbm90Q1NVRUIkSW5jbHVzaXZlLmFuZC5QYXJ0aWNpcGF0b3J5LkdvdmVybmFuY2UuLi4uKStlcnJvcl9pcGcgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KDQoNCiMjYWRkaW5nIHZhbHVlcyBmb3Igc3ViY2F0ZWdvcnkNCmNvbmZpbmZfdGFibGVfaXBnPC1kYXRhLmZyYW1lKHN1YmNhdGVnb3J5PSJJbmNsdXNpdmUuYW5kLlBhcnRpY2lwYXRvcnkuR292ZXJuYW5jZSIsQ0lfbGVmdD1sZWZ0X2lwZyxDSV9yaWdodD1yaWdodF9pcGcsQ1NVRUJfdmFsPWNwX0NTVUVCJEluY2x1c2l2ZS5hbmQuUGFydGljaXBhdG9yeS5Hb3Zlcm5hbmNlLi4uLikjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI2JpbmRpbmcgcm93IGluIHRoZSBkYXRhIGZyYW1lDQpjb25maW5mX3RhYmxlPC1yYmluZChjb25maW5mX3RhYmxlX2lwZyxjb25maW5mX3RhYmxlKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQpjb25maW5mX3RhYmxlDQoNCg0KYGBgDQoNCmBgYHtyfQ0KI0RpdmVyc2l0eSBhbmQgQWZmb3JkYWJpbGl0eSANCg0KDQpkYV9ub3RDU1VFQjwtcGFfZGF0X2RhJT4lDQpmaWx0ZXIoSW5zdGl0dXRpb24hPSJDYWxpZm9ybmlhIFN0YXRlIFVuaXZlcnNpdHksIEVhc3QgQmF5IikjY2hhbmdlIGFmdGVyIGNhdGVnb3J5DQoNCmRhX0NTVUVCPC1wYV9kYXRfZGEgJT4lDQpmaWx0ZXIoSW5zdGl0dXRpb249PSJDYWxpZm9ybmlhIFN0YXRlIFVuaXZlcnNpdHksIEVhc3QgQmF5IikjY2hhbmdlIGFmdGVyIGNhdGVnb3J5DQoNCiMjRGl2ZXJzaXR5LmFuZC5FcXVpdHkuQ29vcmRpbmF0aW9uLi4uLg0KZXJyb3JfZGVjPC0gcXQoMC45NSxkZj1sZW5ndGgoZGFfbm90Q1NVRUIkRGl2ZXJzaXR5LmFuZC5FcXVpdHkuQ29vcmRpbmF0aW9uLi4uLiktMSkqc2QoZGFfbm90Q1NVRUIkRGl2ZXJzaXR5LmFuZC5FcXVpdHkuQ29vcmRpbmF0aW9uLi4uLikvc3FydChsZW5ndGgoZGFfbm90Q1NVRUIkRGl2ZXJzaXR5LmFuZC5FcXVpdHkuQ29vcmRpbmF0aW9uLi4uLikpI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpsZWZ0X2RlYyA8LSBtZWFuKGRhX25vdENTVUVCJERpdmVyc2l0eS5hbmQuRXF1aXR5LkNvb3JkaW5hdGlvbi4uLi4pLWVycm9yX2RlYyAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpyaWdodF9kZWM8LSBtZWFuKGRhX25vdENTVUVCJERpdmVyc2l0eS5hbmQuRXF1aXR5LkNvb3JkaW5hdGlvbi4uLi4pK2Vycm9yX2RlYyAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQoNCg0KIyNhZGRpbmcgdmFsdWVzIGZvciBzdWJjYXRlZ29yeQ0KY29uZmluZl90YWJsZV9kZWM8LWRhdGEuZnJhbWUoc3ViY2F0ZWdvcnk9IkRpdmVyc2l0eS5hbmQuRXF1aXR5LkNvb3JkaW5hdGlvbiIsQ0lfbGVmdD1sZWZ0X2RlYyxDSV9yaWdodD1yaWdodF9kZWMsQ1NVRUJfdmFsPWRhX0NTVUVCJERpdmVyc2l0eS5hbmQuRXF1aXR5LkNvb3JkaW5hdGlvbi4uLi4pIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KIyNiaW5kaW5nIHJvdyBpbiB0aGUgZGF0YSBmcmFtZQ0KY29uZmluZl90YWJsZTwtcmJpbmQoY29uZmluZl90YWJsZV9kZWMsY29uZmluZl90YWJsZSkjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQoNCg0KIyNBc3Nlc3NpbmcuRGl2ZXJzaXR5LmFuZC5FcXVpdHkuLi4uDQplcnJvcl9hZGU8LSBxdCgwLjk1LGRmPWxlbmd0aChkYV9ub3RDU1VFQiRBc3Nlc3NpbmcuRGl2ZXJzaXR5LmFuZC5FcXVpdHkuLi4uKS0xKSpzZChkYV9ub3RDU1VFQiRBc3Nlc3NpbmcuRGl2ZXJzaXR5LmFuZC5FcXVpdHkuLi4uKS9zcXJ0KGxlbmd0aChkYV9ub3RDU1VFQiRBc3Nlc3NpbmcuRGl2ZXJzaXR5LmFuZC5FcXVpdHkuLi4uKSkjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCmxlZnRfYWRlIDwtIG1lYW4oZGFfbm90Q1NVRUIkQXNzZXNzaW5nLkRpdmVyc2l0eS5hbmQuRXF1aXR5Li4uLiktZXJyb3JfYWRlICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCnJpZ2h0X2FkZTwtIG1lYW4oZGFfbm90Q1NVRUIkQXNzZXNzaW5nLkRpdmVyc2l0eS5hbmQuRXF1aXR5Li4uLikrZXJyb3JfYWRlICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCg0KDQojI2FkZGluZyB2YWx1ZXMgZm9yIHN1YmNhdGVnb3J5DQpjb25maW5mX3RhYmxlX2FkZTwtZGF0YS5mcmFtZShzdWJjYXRlZ29yeT0iQXNzZXNzaW5nLkRpdmVyc2l0eS5hbmQuRXF1aXR5IixDSV9sZWZ0PWxlZnRfYWRlLENJX3JpZ2h0PXJpZ2h0X2FkZSxDU1VFQl92YWw9ZGFfQ1NVRUIkQXNzZXNzaW5nLkRpdmVyc2l0eS5hbmQuRXF1aXR5Li4uLikjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI2JpbmRpbmcgcm93IGluIHRoZSBkYXRhIGZyYW1lDQpjb25maW5mX3RhYmxlPC1yYmluZChjb25maW5mX3RhYmxlX2FkZSxjb25maW5mX3RhYmxlKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCg0KIyNTdXBwb3J0LmZvci5VbmRlcnJlcHJlc2VudGVkLkdyb3Vwcy4uLi4NCmVycm9yX3N1ZzwtIHF0KDAuOTUsZGY9bGVuZ3RoKGRhX25vdENTVUVCJFN1cHBvcnQuZm9yLlVuZGVycmVwcmVzZW50ZWQuR3JvdXBzLi4uLiktMSkqc2QoZGFfbm90Q1NVRUIkU3VwcG9ydC5mb3IuVW5kZXJyZXByZXNlbnRlZC5Hcm91cHMuLi4uKS9zcXJ0KGxlbmd0aChkYV9ub3RDU1VFQiRTdXBwb3J0LmZvci5VbmRlcnJlcHJlc2VudGVkLkdyb3Vwcy4uLi4pKSNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KbGVmdF9zdWcgPC0gbWVhbihkYV9ub3RDU1VFQiRTdXBwb3J0LmZvci5VbmRlcnJlcHJlc2VudGVkLkdyb3Vwcy4uLi4pLWVycm9yX3N1ZyAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpyaWdodF9zdWc8LSBtZWFuKGRhX25vdENTVUVCJFN1cHBvcnQuZm9yLlVuZGVycmVwcmVzZW50ZWQuR3JvdXBzLi4uLikrZXJyb3Jfc3VnICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCg0KDQojI2FkZGluZyB2YWx1ZXMgZm9yIHN1YmNhdGVnb3J5DQpjb25maW5mX3RhYmxlX3N1ZzwtZGF0YS5mcmFtZShzdWJjYXRlZ29yeT0iU3VwcG9ydC5mb3IuVW5kZXJyZXByZXNlbnRlZC5Hcm91cHMiLENJX2xlZnQ9bGVmdF9zdWcsQ0lfcmlnaHQ9cmlnaHRfc3VnLENTVUVCX3ZhbD1kYV9DU1VFQiRTdXBwb3J0LmZvci5VbmRlcnJlcHJlc2VudGVkLkdyb3Vwcy4uLi4pIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KIyNiaW5kaW5nIHJvdyBpbiB0aGUgZGF0YSBmcmFtZQ0KY29uZmluZl90YWJsZTwtcmJpbmQoY29uZmluZl90YWJsZV9zdWcsY29uZmluZl90YWJsZSkjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI0FmZm9yZGFiaWxpdHkuYW5kLkFjY2Vzcy4uLi4NCmVycm9yX2FhPC0gcXQoMC45NSxkZj1sZW5ndGgoZGFfbm90Q1NVRUIkQWZmb3JkYWJpbGl0eS5hbmQuQWNjZXNzLi4uLiktMSkqc2QoZGFfbm90Q1NVRUIkQWZmb3JkYWJpbGl0eS5hbmQuQWNjZXNzLi4uLikvc3FydChsZW5ndGgoZGFfbm90Q1NVRUIkQWZmb3JkYWJpbGl0eS5hbmQuQWNjZXNzLi4uLikpI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpsZWZ0X2FhIDwtIG1lYW4oZGFfbm90Q1NVRUIkQWZmb3JkYWJpbGl0eS5hbmQuQWNjZXNzLi4uLiktZXJyb3JfYWEgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KcmlnaHRfYWE8LSBtZWFuKGRhX25vdENTVUVCJEFmZm9yZGFiaWxpdHkuYW5kLkFjY2Vzcy4uLi4pK2Vycm9yX2FhICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCg0KDQojI2FkZGluZyB2YWx1ZXMgZm9yIHN1YmNhdGVnb3J5DQpjb25maW5mX3RhYmxlX2FhPC1kYXRhLmZyYW1lKHN1YmNhdGVnb3J5PSJBZmZvcmRhYmlsaXR5LmFuZC5BY2Nlc3MiLENJX2xlZnQ9bGVmdF9hYSxDSV9yaWdodD1yaWdodF9hYSxDU1VFQl92YWw9ZGFfQ1NVRUIkQWZmb3JkYWJpbGl0eS5hbmQuQWNjZXNzLi4uLikjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI2JpbmRpbmcgcm93IGluIHRoZSBkYXRhIGZyYW1lDQpjb25maW5mX3RhYmxlPC1yYmluZChjb25maW5mX3RhYmxlX2FhLGNvbmZpbmZfdGFibGUpIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCmNvbmZpbmZfdGFibGUNCg0KYGBgDQoNCmBgYHtyfQ0KIyBJbnZlc3RtZW50IGFuZCBmaW5hbmNlDQoNCg0KaWZfbm90Q1NVRUI8LXBhX2RhdF9pZiU+JQ0KZmlsdGVyKEluc3RpdHV0aW9uIT0iQ2FsaWZvcm5pYSBTdGF0ZSBVbml2ZXJzaXR5LCBFYXN0IEJheSIpI2NoYW5nZSBhZnRlciBjYXRlZ29yeQ0KDQppZl9DU1VFQjwtcGFfZGF0X2lmICU+JQ0KZmlsdGVyKEluc3RpdHV0aW9uPT0iQ2FsaWZvcm5pYSBTdGF0ZSBVbml2ZXJzaXR5LCBFYXN0IEJheSIpI2NoYW5nZSBhZnRlciBjYXRlZ29yeQ0KDQojI0NvbW1pdHRlZS5vbi5JbnZlc3Rvci5SZXNwb25zaWJpbGl0eS4uLi4NCmVycm9yX2NpcjwtIHF0KDAuOTUsZGY9bGVuZ3RoKGlmX25vdENTVUVCJENvbW1pdHRlZS5vbi5JbnZlc3Rvci5SZXNwb25zaWJpbGl0eS4uLi4pLTEpKnNkKGlmX25vdENTVUVCJENvbW1pdHRlZS5vbi5JbnZlc3Rvci5SZXNwb25zaWJpbGl0eS4uLi4pL3NxcnQobGVuZ3RoKGlmX25vdENTVUVCJENvbW1pdHRlZS5vbi5JbnZlc3Rvci5SZXNwb25zaWJpbGl0eS4uLi4pKSNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KbGVmdF9jaXIgPC0gbWVhbihpZl9ub3RDU1VFQiRDb21taXR0ZWUub24uSW52ZXN0b3IuUmVzcG9uc2liaWxpdHkuLi4uKS1lcnJvcl9jaXIgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KcmlnaHRfY2lyPC0gbWVhbihpZl9ub3RDU1VFQiRDb21taXR0ZWUub24uSW52ZXN0b3IuUmVzcG9uc2liaWxpdHkuLi4uKStlcnJvcl9jaXIgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KDQoNCiMjYWRkaW5nIHZhbHVlcyBmb3Igc3ViY2F0ZWdvcnkNCmNvbmZpbmZfdGFibGVfY2lyPC1kYXRhLmZyYW1lKHN1YmNhdGVnb3J5PSJDb21taXR0ZWUub24uSW52ZXN0b3IuUmVzcG9uc2liaWxpdHkiLENJX2xlZnQ9MCxDSV9yaWdodD1yaWdodF9jaXIsQ1NVRUJfdmFsPWlmX0NTVUVCJENvbW1pdHRlZS5vbi5JbnZlc3Rvci5SZXNwb25zaWJpbGl0eS4uLi4pIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KIyNiaW5kaW5nIHJvdyBpbiB0aGUgZGF0YSBmcmFtZQ0KY29uZmluZl90YWJsZTwtcmJpbmQoY29uZmluZl90YWJsZV9jaXIsY29uZmluZl90YWJsZSkjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQoNCg0KIyNTdXN0YWluYWJsZS5JbnZlc3RtZW50Li4uLg0KZXJyb3Jfc2k8LSBxdCgwLjk1LGRmPWxlbmd0aChpZl9ub3RDU1VFQiRTdXN0YWluYWJsZS5JbnZlc3RtZW50Li4uLiktMSkqc2QoaWZfbm90Q1NVRUIkU3VzdGFpbmFibGUuSW52ZXN0bWVudC4uLi4pL3NxcnQobGVuZ3RoKGlmX25vdENTVUVCJFN1c3RhaW5hYmxlLkludmVzdG1lbnQuLi4uKSkjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCmxlZnRfc2kgPC0gbWVhbihpZl9ub3RDU1VFQiRTdXN0YWluYWJsZS5JbnZlc3RtZW50Li4uLiktZXJyb3Jfc2kgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KcmlnaHRfc2k8LSBtZWFuKGlmX25vdENTVUVCJFN1c3RhaW5hYmxlLkludmVzdG1lbnQuLi4uKStlcnJvcl9zaSAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQoNCg0KIyNhZGRpbmcgdmFsdWVzIGZvciBzdWJjYXRlZ29yeQ0KY29uZmluZl90YWJsZV9zaTwtZGF0YS5mcmFtZShzdWJjYXRlZ29yeT0iU3VzdGFpbmFibGUuSW52ZXN0bWVudCIsQ0lfbGVmdD1sZWZ0X3NpLENJX3JpZ2h0PXJpZ2h0X3NpLENTVUVCX3ZhbD1pZl9DU1VFQiRTdXN0YWluYWJsZS5JbnZlc3RtZW50Li4uLikjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI2JpbmRpbmcgcm93IGluIHRoZSBkYXRhIGZyYW1lDQpjb25maW5mX3RhYmxlPC1yYmluZChjb25maW5mX3RhYmxlX3NpLGNvbmZpbmZfdGFibGUpIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KDQoNCiMjSW52ZXN0bWVudC5EaXNjbG9zdXJlLi4uLg0KZXJyb3JfaWQ8LSBxdCgwLjk1LGRmPWxlbmd0aChpZl9ub3RDU1VFQiRJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uKS0xKSpzZChpZl9ub3RDU1VFQiRJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uKS9zcXJ0KGxlbmd0aChpZl9ub3RDU1VFQiRJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uKSkjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCmxlZnRfaWQgPC0gbWVhbihpZl9ub3RDU1VFQiRJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uKS1lcnJvcl9pZCAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpyaWdodF9pZDwtIG1lYW4oaWZfbm90Q1NVRUIkSW52ZXN0bWVudC5EaXNjbG9zdXJlLi4uLikrZXJyb3JfaWQgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KDQoNCiMjYWRkaW5nIHZhbHVlcyBmb3Igc3ViY2F0ZWdvcnkNCmNvbmZpbmZfdGFibGVfaWQ8LWRhdGEuZnJhbWUoc3ViY2F0ZWdvcnk9IkludmVzdG1lbnQuRGlzY2xvc3VyZSIsQ0lfbGVmdD1sZWZ0X2lkLENJX3JpZ2h0PXJpZ2h0X2lkLENTVUVCX3ZhbD1pZl9DU1VFQiRJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCiMjYmluZGluZyByb3cgaW4gdGhlIGRhdGEgZnJhbWUNCmNvbmZpbmZfdGFibGU8LXJiaW5kKGNvbmZpbmZfdGFibGVfaWQsY29uZmluZl90YWJsZSkjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KY29uZmluZl90YWJsZQ0KDQojY29sbmFtZXMocGFfZGF0KQ0KYGBgDQoNCmBgYHtyfQ0KI1dlbGxiZWluZyBhbmQgd29yaw0KDQoNCg0Kd3dfbm90Q1NVRUI8LXBhX2RhdF93dyU+JQ0KZmlsdGVyKEluc3RpdHV0aW9uIT0iQ2FsaWZvcm5pYSBTdGF0ZSBVbml2ZXJzaXR5LCBFYXN0IEJheSIpI2NoYW5nZSBhZnRlciBjYXRlZ29yeQ0KDQp3d19DU1VFQjwtcGFfZGF0X3d3JT4lDQpmaWx0ZXIoSW5zdGl0dXRpb249PSJDYWxpZm9ybmlhIFN0YXRlIFVuaXZlcnNpdHksIEVhc3QgQmF5IikjY2hhbmdlIGFmdGVyIGNhdGVnb3J5DQoNCiMjRW1wbG95ZWUuQ29tcGVuc2F0aW9uLi4uLg0KZXJyb3JfZWM8LSBxdCgwLjk1LGRmPWxlbmd0aCh3d19ub3RDU1VFQiRFbXBsb3llZS5Db21wZW5zYXRpb24uLi4uKS0xKSpzZCh3d19ub3RDU1VFQiRFbXBsb3llZS5Db21wZW5zYXRpb24uLi4uKS9zcXJ0KGxlbmd0aCh3d19ub3RDU1VFQiRFbXBsb3llZS5Db21wZW5zYXRpb24uLi4uKSkjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCmxlZnRfZWMgPC0gbWVhbih3d19ub3RDU1VFQiRFbXBsb3llZS5Db21wZW5zYXRpb24uLi4uKS1lcnJvcl9lYyAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpyaWdodF9lYzwtIG1lYW4od3dfbm90Q1NVRUIkRW1wbG95ZWUuQ29tcGVuc2F0aW9uLi4uLikrZXJyb3JfZWMgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KDQoNCiMjYWRkaW5nIHZhbHVlcyBmb3Igc3ViY2F0ZWdvcnkNCmNvbmZpbmZfdGFibGVfZWM8LWRhdGEuZnJhbWUoc3ViY2F0ZWdvcnk9IkVtcGxveWVlLkNvbXBlbnNhdGlvbiIsQ0lfbGVmdD1sZWZ0X2VjLENJX3JpZ2h0PXJpZ2h0X2VjLENTVUVCX3ZhbD13d19DU1VFQiRFbXBsb3llZS5Db21wZW5zYXRpb24uLi4uKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCiMjYmluZGluZyByb3cgaW4gdGhlIGRhdGEgZnJhbWUNCmNvbmZpbmZfdGFibGU8LXJiaW5kKGNvbmZpbmZfdGFibGVfZWMsY29uZmluZl90YWJsZSkjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQoNCg0KIyNBc3Nlc3NpbmcuRW1wbG95ZWUuU2F0aXNmYWN0aW9uLi4uLg0KZXJyb3JfYWVzPC0gcXQoMC45NSxkZj1sZW5ndGgod3dfbm90Q1NVRUIkQXNzZXNzaW5nLkVtcGxveWVlLlNhdGlzZmFjdGlvbi4uLi4pLTEpKnNkKHd3X25vdENTVUVCJEFzc2Vzc2luZy5FbXBsb3llZS5TYXRpc2ZhY3Rpb24uLi4uKS9zcXJ0KGxlbmd0aCh3d19ub3RDU1VFQiRBc3Nlc3NpbmcuRW1wbG95ZWUuU2F0aXNmYWN0aW9uLi4uLikpI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpsZWZ0X2FlcyA8LSBtZWFuKHd3X25vdENTVUVCJEFzc2Vzc2luZy5FbXBsb3llZS5TYXRpc2ZhY3Rpb24uLi4uKS1lcnJvcl9hZXMgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KcmlnaHRfYWVzPC0gbWVhbih3d19ub3RDU1VFQiRBc3Nlc3NpbmcuRW1wbG95ZWUuU2F0aXNmYWN0aW9uLi4uLikrZXJyb3JfYWVzICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCg0KDQojI2FkZGluZyB2YWx1ZXMgZm9yIHN1YmNhdGVnb3J5DQpjb25maW5mX3RhYmxlX2FlczwtZGF0YS5mcmFtZShzdWJjYXRlZ29yeT0iQXNzZXNzaW5nLkVtcGxveWVlLlNhdGlzZmFjdGlvbiIsQ0lfbGVmdD1sZWZ0X2FlcyxDSV9yaWdodD1yaWdodF9hZXMsQ1NVRUJfdmFsPXd3X0NTVUVCJEFzc2Vzc2luZy5FbXBsb3llZS5TYXRpc2ZhY3Rpb24uLi4uKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCiMjYmluZGluZyByb3cgaW4gdGhlIGRhdGEgZnJhbWUNCmNvbmZpbmZfdGFibGU8LXJiaW5kKGNvbmZpbmZfdGFibGVfYWVzLGNvbmZpbmZfdGFibGUpIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KDQojI1dlbGxuZXNzLlByb2dyYW0uLi4uDQplcnJvcl93cDwtIHF0KDAuOTUsZGY9bGVuZ3RoKHd3X25vdENTVUVCJFdlbGxuZXNzLlByb2dyYW0uLi4uKS0xKSpzZCh3d19ub3RDU1VFQiRXZWxsbmVzcy5Qcm9ncmFtLi4uLikvc3FydChsZW5ndGgod3dfbm90Q1NVRUIkV2VsbG5lc3MuUHJvZ3JhbS4uLi4pKSNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KbGVmdF93cCA8LSBtZWFuKHd3X25vdENTVUVCJFdlbGxuZXNzLlByb2dyYW0uLi4uKS1lcnJvcl93cCAjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQpyaWdodF93cDwtIG1lYW4od3dfbm90Q1NVRUIkV2VsbG5lc3MuUHJvZ3JhbS4uLi4pK2Vycm9yX3dwICMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCg0KDQojI2FkZGluZyB2YWx1ZXMgZm9yIHN1YmNhdGVnb3J5DQpjb25maW5mX3RhYmxlX3dwPC1kYXRhLmZyYW1lKHN1YmNhdGVnb3J5PSJXZWxsbmVzcy5Qcm9ncmFtIixDSV9sZWZ0PWxlZnRfd3AsQ0lfcmlnaHQ9cmlnaHRfd3AsQ1NVRUJfdmFsPXd3X0NTVUVCJFdlbGxuZXNzLlByb2dyYW0uLi4uKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCiMjYmluZGluZyByb3cgaW4gdGhlIGRhdGEgZnJhbWUNCmNvbmZpbmZfdGFibGU8LXJiaW5kKGNvbmZpbmZfdGFibGVfd3AsY29uZmluZl90YWJsZSkjI2NoYW5nZSBhZnRlciBzdWJjYXRlZ29yeQ0KDQojI1dvcmtwbGFjZS5IZWFsdGguYW5kLlNhZmV0eS4uLi4NCmVycm9yX3doczwtIHF0KDAuOTUsZGY9bGVuZ3RoKHd3X25vdENTVUVCJFdvcmtwbGFjZS5IZWFsdGguYW5kLlNhZmV0eS4uLi4pLTEpKnNkKHd3X25vdENTVUVCJFdvcmtwbGFjZS5IZWFsdGguYW5kLlNhZmV0eS4uLi4pL3NxcnQobGVuZ3RoKHd3X25vdENTVUVCJFdvcmtwbGFjZS5IZWFsdGguYW5kLlNhZmV0eS4uLi4pKSNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KbGVmdF93aHMgPC0gbWVhbih3d19ub3RDU1VFQiRXb3JrcGxhY2UuSGVhbHRoLmFuZC5TYWZldHkuLi4uKS1lcnJvcl93aHMgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KcmlnaHRfd2hzPC0gbWVhbih3d19ub3RDU1VFQiRXb3JrcGxhY2UuSGVhbHRoLmFuZC5TYWZldHkuLi4uKStlcnJvcl93aHMgIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCg0KDQoNCiMjYWRkaW5nIHZhbHVlcyBmb3Igc3ViY2F0ZWdvcnkNCmNvbmZpbmZfdGFibGVfd2hzPC1kYXRhLmZyYW1lKHN1YmNhdGVnb3J5PSJXb3JrcGxhY2UuSGVhbHRoLmFuZC5TYWZldHkiLENJX2xlZnQ9bGVmdF93aHMsQ0lfcmlnaHQ9cmlnaHRfd2hzLENTVUVCX3ZhbD13d19DU1VFQiRXb3JrcGxhY2UuSGVhbHRoLmFuZC5TYWZldHkuLi4uKSMjY2hhbmdlIGFmdGVyIHN1YmNhdGVnb3J5DQoNCiMjYmluZGluZyByb3cgaW4gdGhlIGRhdGEgZnJhbWUNCmNvbmZpbmZfdGFibGU8LXJiaW5kKGNvbmZpbmZfdGFibGVfd2hzLGNvbmZpbmZfdGFibGUpIyNjaGFuZ2UgYWZ0ZXIgc3ViY2F0ZWdvcnkNCmNvbmZpbmZfdGFibGUlPiVhcnJhbmdlKENTVUVCX3ZhbCkNCmdncGxvdChjb25maW5mX3RhYmxlKSsNCiAgZ2VvbV9jcm9zc2JhcihhZXMoeD1zdWJjYXRlZ29yeSx5PShDSV9sZWZ0K0NJX3JpZ2h0KS8yLHltaW49Q0lfbGVmdCx5bWF4PUNJX3JpZ2h0KSx4bGFiPSIiLHlsYWI9Im1lYW4iKSsNCiAgZ2VvbV9wb2ludChhZXMoeD1zdWJjYXRlZ29yeSx5PUNTVUVCX3ZhbCksY29sPSJyZWQiKSArIA0KICBjb29yZF9mbGlwKCkrDQogIGdndGl0bGUoIlBsYW5uaW5nIGFuZCBBZG1pbmlzdHJhdGlvbiIpK3lsYWIoIm1lYW4iKQ0KDQoNCmBgYA0KI0NsaW1hdGUgQWN0aW9uIFBsYW4NCiMjUEEgMiwzLDQNCmBgYHtyfQ0KcGFfZGF0X2NwPC1wYV9kYXQlPiVzZWxlY3QoSW5zdGl0dXRpb24sU3Rhci5jYXRlZ29yeSxTdXN0YWluYWJpbGl0eS5QbGFubmluZy4uLi4sSW5jbHVzaXZlLmFuZC5QYXJ0aWNpcGF0b3J5LkdvdmVybmFuY2UuLi4uLFJlcG9ydGluZy5Bc3N1cmFuY2UuLi4uKQ0KI3BhX2RhdF9jcA0KDQpwYV9kYXRfY3BfcmVzaGFwZWQ8LXBhX2RhdF9jcCU+JQ0KICBnYXRoZXIoY3Bfc3ViY2F0ZWdvcnksc2NvcmUsU3VzdGFpbmFiaWxpdHkuUGxhbm5pbmcuLi4uLEluY2x1c2l2ZS5hbmQuUGFydGljaXBhdG9yeS5Hb3Zlcm5hbmNlLi4uLixSZXBvcnRpbmcuQXNzdXJhbmNlLi4uLiklPiUNCiAgIG11dGF0ZShQQV9jcmVkaXRzPSBOQSwNCiAgICAgICAgICAgICAgICAgICAgUEFfY3JlZGl0cz1pZmVsc2UoY3Bfc3ViY2F0ZWdvcnk9PSJTdXN0YWluYWJpbGl0eS5QbGFubmluZy4uLi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBLTI6IFN1c3RhaW5hYmlsaXR5IFBsYW5uaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFfY3JlZGl0cyksDQogICAgICAgICAgIFBBX2NyZWRpdHM9aWZlbHNlKGNwX3N1YmNhdGVnb3J5PT0iSW5jbHVzaXZlLmFuZC5QYXJ0aWNpcGF0b3J5LkdvdmVybmFuY2UuLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQS0zOiBQYXJ0aWNpcGF0b3J5IEdvdmVybmFuY2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQV9jcmVkaXRzKSwNCiAgICAgICAgICAgUEFfY3JlZGl0cz1pZmVsc2UoY3Bfc3ViY2F0ZWdvcnk9PSJSZXBvcnRpbmcuQXNzdXJhbmNlLi4uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEEtNDogRGl2ZXJzaXR5IGFuZCBFcXVpdHkgQ29vcmRpbmF0aW9uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFfY3JlZGl0cykpICU+JQ0KICAgIG11dGF0ZShzdGFyX2NhdD1pZmVsc2UoSW5zdGl0dXRpb249PSJDYWxpZm9ybmlhIFN0YXRlIFVuaXZlcnNpdHksIEVhc3QgQmF5IiwgIkNTVUVCIixhcy5jaGFyYWN0ZXIoU3Rhci5jYXRlZ29yeSkpKQ0KDQojI1ZpZXcocGFfZGF0X2NwX3Jlc2hhcGVkKQ0KcGFfZGF0X2NwX3Jlc2hhcGVkJHN0YXJfY2F0IDwtIGZhY3RvcihwYV9kYXRfY3BfcmVzaGFwZWQkc3Rhcl9jYXQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscz1jKCJicm9uemUiLCJzaWx2ZXIiLCJnb2xkIiwiQ1NVRUIiKSkNCmdncGxvdChwYV9kYXRfY3BfcmVzaGFwZWQpICsNCiAgZ2VvbV9ib3hwbG90KGFlcyh4PVBBX2NyZWRpdHMsIHk9c2NvcmUpLCBjb2xvcj0icmVkIikgKw0KICBnZW9tX2ppdHRlcihhZXMoeD1QQV9jcmVkaXRzLCB5PXNjb3JlLCBjb2xvcj1zdGFyX2NhdCwgc2hhcGU9c3Rhcl9jYXQsIHNpemU9c3Rhcl9jYXQpKSArDQogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lPSJTdGFyIFJhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiYnJvbnplIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj00KSkgKw0KICAgIHNjYWxlX3NpemVfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsdmVyIj0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvbGQiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NVRUIiPTQpKSArDQogICAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPSJkYXJrcmVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWx2ZXIiPSJncmF5NDciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvbGQiPSJvcmFuZ2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj0iI2ZmMDAwMCIpKSsNCiAgZ2d0aXRsZSgiUGxhbm5pbmcgYW5kIEFkbWluaXN0cmF0aW9uIikrDQogIGNvb3JkX2ZsaXAoKSt5bGFiKCJQZXJjZW50YWdlIG9mIHRvdGFsIHNjb3JlIikNCmhlYWQocGFfZGF0KQ0KYGBgDQojI1BBIDksMTAsMTENCmBgYHtyfQ0KcGFfZGF0X2NwPC1wYV9kYXQlPiVzZWxlY3QoSW5zdGl0dXRpb24sU3Rhci5jYXRlZ29yeSxTdXN0YWluYWJsZS5JbnZlc3RtZW50Li4uLixJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uLEVtcGxveWVlLkNvbXBlbnNhdGlvbi4uLi4pDQojcGFfZGF0X2NwDQoNCnBhX2RhdF9jcF9yZXNoYXBlZDwtcGFfZGF0X2NwJT4lDQogIGdhdGhlcihjcF9zdWJjYXRlZ29yeSxzY29yZSxTdXN0YWluYWJsZS5JbnZlc3RtZW50Li4uLixJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uLEVtcGxveWVlLkNvbXBlbnNhdGlvbi4uLi4pJT4lDQogICBtdXRhdGUoUEFfY3JlZGl0cz0gTkEsDQogICAgICAgICAgICAgICAgICAgIFBBX2NyZWRpdHM9aWZlbHNlKGNwX3N1YmNhdGVnb3J5PT0iU3VzdGFpbmFibGUuSW52ZXN0bWVudC4uLi4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBBLTk6IFN1c3RhaW5hYmxlIEludmVzdG1lbnQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQV9jcmVkaXRzKSwNCiAgICAgICAgICAgUEFfY3JlZGl0cz1pZmVsc2UoY3Bfc3ViY2F0ZWdvcnk9PSJJbnZlc3RtZW50LkRpc2Nsb3N1cmUuLi4uIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQS0xMDogSW52ZXN0bWVudCBEaXNjbG9zdXJlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFfY3JlZGl0cyksDQogICAgICAgICAgIFBBX2NyZWRpdHM9aWZlbHNlKGNwX3N1YmNhdGVnb3J5PT0iRW1wbG95ZWUuQ29tcGVuc2F0aW9uLi4uLiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUEEtMTE6IEVtcGxveWVlIENvbXBlbnNhdGlvbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBX2NyZWRpdHMpKSAlPiUNCiAgICBtdXRhdGUoc3Rhcl9jYXQ9aWZlbHNlKEluc3RpdHV0aW9uPT0iQ2FsaWZvcm5pYSBTdGF0ZSBVbml2ZXJzaXR5LCBFYXN0IEJheSIsICJDU1VFQiIsYXMuY2hhcmFjdGVyKFN0YXIuY2F0ZWdvcnkpKSkNCg0KIyNWaWV3KHBhX2RhdF9jcF9yZXNoYXBlZCkNCnBhX2RhdF9jcF9yZXNoYXBlZCRzdGFyX2NhdCA8LSBmYWN0b3IocGFfZGF0X2NwX3Jlc2hhcGVkJHN0YXJfY2F0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHM9YygiYnJvbnplIiwic2lsdmVyIiwiZ29sZCIsIkNTVUVCIikpDQpnZ3Bsb3QocGFfZGF0X2NwX3Jlc2hhcGVkKSArDQogIGdlb21fYm94cGxvdChhZXMoeD1QQV9jcmVkaXRzLCB5PXNjb3JlKSwgY29sb3I9InJlZCIpICsNCiAgZ2VvbV9qaXR0ZXIoYWVzKHg9UEFfY3JlZGl0cywgeT1zY29yZSwgY29sb3I9c3Rhcl9jYXQsIHNoYXBlPXN0YXJfY2F0LCBzaXplPXN0YXJfY2F0KSkgKw0KICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZT0iU3RhciBSYXRpbmciLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoImJyb256ZSI9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWx2ZXIiPTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZCI9MSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU1VFQiI9NCkpICsNCiAgICBzY2FsZV9zaXplX21hbnVhbChuYW1lPSJTdGFyIFJhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiYnJvbnplIj0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkIj0zLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNTVUVCIj00KSkgKw0KICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lPSJTdGFyIFJhdGluZyIsDQogICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9YygiYnJvbnplIj0iZGFya3JlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsdmVyIj0iZ3JheTQ3IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb2xkIj0ib3JhbmdlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU1VFQiI9IiNmZjAwMDAiKSkrDQogIGdndGl0bGUoIlBsYW5uaW5nIGFuZCBBZG1pbmlzdHJhdGlvbiIpKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KIyNQTE9UTFkgR3JhcGgNCmBgYHtyfQ0KbGlicmFyeShwbG90bHkpDQpwYV9seTwtZ2dwbG90KHBhX2RhdF9jcF9yZXNoYXBlZCkgKw0KICBnZW9tX2JveHBsb3QoYWVzKHg9UEFfY3JlZGl0cywgeT1zY29yZSksIGNvbG9yPSJyZWQiKSArDQogIGdlb21faml0dGVyKGFlcyh4PVBBX2NyZWRpdHMsIHk9c2NvcmUsIGNvbG9yPXN0YXJfY2F0LCBzaGFwZT1zdGFyX2NhdCwgc2l6ZT1zdGFyX2NhdCxsYWJlbD1JbnN0aXR1dGlvbikpICsNCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWU9IlN0YXIgUmF0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcz1jKCJicm9uemUiPTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsdmVyIj0xLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvbGQiPTEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NVRUIiPTQpKSArDQogICAgc2NhbGVfc2l6ZV9tYW51YWwobmFtZT0iU3RhciBSYXRpbmciLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoImJyb256ZSI9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWx2ZXIiPTMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZCI9MywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDU1VFQiI9NCkpICsNCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZT0iU3RhciBSYXRpbmciLA0KICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPWMoImJyb256ZSI9ImRhcmtyZWQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpbHZlciI9ImdyYXk0NyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29sZCI9Im9yYW5nZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ1NVRUIiPSIjZmYwMDAwIikpKw0KICBnZ3RpdGxlKCJQbGFubmluZyBhbmQgQWRtaW5pc3RyYXRpb24iKSsNCiAgY29vcmRfZmxpcCgpDQpnZ3Bsb3RseShwYV9seSkNCiNnZmhnaA0KYGBgDQoNCg==